"""
    名称：
        英文名称：Module.Functions
        中文名称：自定义方法模块

    定义：
        【函数】Center_Window       窗体居中方法
        【函数】Get_Host_IP         获取本机IP方法
        【函数】Get_Broadcast_IP    获取局域网广播地址方法
"""

# 导入相关模块
import netifaces        # netifaces获取IP、MAC、NETMASK、BROADCAST


__all__ = [
    'Center_Window', 'Get_Host_IP', 'Get_Broadcast_IP'
]


def Center_Window(window, width, height):
    """
        窗体居中方法

        参数：
            window：要操作的窗体
            width：宽度
            height：高度
    """

    # 获取屏幕高度宽度
    screenwidth = window.winfo_screenwidth()
    screenheight = window.winfo_screenheight()
    # 定义窗口宽度、高度、左边距、右边距
    g = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2,
                         (screenheight - height) / 2)
    # 设置窗体属性
    window.geometry(g)


def Get_Host_IP():
    """
        利用netifaces获取局域网IP方法

        不处理双网卡问题
    """
    # 获取网卡的名称？
    # 双网卡存在问题，需要针对双网卡选择网络，暂不处理
    routingNicName = netifaces.gateways()['default'][netifaces.AF_INET][1]
    # 循环netifaces.interfaces()获取到的网卡名称列表
    for interface in netifaces.interfaces():
        # 如果当前循环到的网卡名称与当前网关的名称一致
        if interface == routingNicName:
            # 尝试获取本局域网广播地址
            try:
                # 获取广播地址
                ip = netifaces.ifaddresses(
                    interface)[netifaces.AF_INET][0]['addr']
                # 返回广播地址
                return ip
            except KeyError:
                # 获取失败返回pass
                pass
    # 获取失败返回 None
    return None

    # 原处理逻辑
    # """
    # 获取本机IP

    # 获取本机IP方式很多，还有其他，这种比较优雅和简单，通过socket对象，但是双网卡是会出问题
    # 所以更换为新的获取方式
    # """
    # # 创建socket对象，并通过此对象获取本机IP
    # try:
    #     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    #     s.connect(('8.8.8.8', 80))
    #     ip = s.getsockname()[0]
    # finally:
    #     s.close()
    # # 返回IP
    # return ip


def Get_Broadcast_IP():
    """
        利用netifaces获取局域网广播地址方法

        不处理双网卡问题
    """
    # 获取网卡的名称？
    # 双网卡存在问题，需要针对双网卡选择网络，暂不处理
    routingNicName = netifaces.gateways()['default'][netifaces.AF_INET][1]
    # 循环netifaces.interfaces()获取到的网卡名称列表
    for interface in netifaces.interfaces():
        # 如果当前循环到的网卡名称与当前网关的名称一致
        if interface == routingNicName:
            # 尝试获取本局域网广播地址
            try:
                # 获取广播地址
                broadcastip = netifaces.ifaddresses(
                    interface)[netifaces.AF_INET][0]['broadcast']
                # 返回广播地址
                return broadcastip
            except KeyError:
                # 获取失败返回pass
                pass
    # 获取失败返回 255.255.255.255
    return '255.255.255.255'
